Technical Q&A QA1234
Accessing HTTPS Proxy Settings


Q: Mac OS X 10.2 Ç≈ÇÕÅAÅuÉlÉbÉgÉèÅ[ÉNÅvä¬ã´ê›íËÉpÉlÉãÇ… Secure Web ÉvÉçÉLÉV (HTTPS) Çê›íËÇ∑ÇÈêVǵǢÉtÉBÅ[ÉãÉhÇ™í«â¡Ç≥ÇÍǃǢNjÇ∑ÅBInternet Config API Çí Ç∂ǃDZÇÍÇÁÇÃê›íËílÇéÊìæÇ∑ÇÈï˚ñ@ÇÕǻǢÇÊǧÇ≈Ç∑ÅBDZÇÍÇÁÇÃÉtÉBÅ[ÉãÉhÇ…ÉAÉNÉZÉXÇ∑ÇÈÇ…ÇÕǫǧǵÇΩÇÁÇÊÇ¢Ç≈ǵÇÂǧǩÅH

A: åªéûì_Ç≈ÇÕÅAInternet Config API Çí Ç∂ǃ HTTPS ÉvÉçÉLÉVÇ…ä÷Ç∑ÇÈèÓïÒÇéÊìæÇ∑ÇÈï˚ñ@ÇÕdžÇËÇ‹ÇπÇÒÅBë„ÇÌÇËÇ…ÅASystem Configuration ÉtÉåÅ[ÉÄÉèÅ[ÉNÇ©ÇÁDZÇÃèÓïÒÇì«Ç›çûÇfiïKóvǙdžÇËÇ‹Ç∑ÅB

íçãLÅF
ëΩÇ≠ÇÃì_Ç≈ÅAMac OS X Çà Internet Config API ÇÕÅAå›ä∑ê´Çï€éùÇ∑ÇÈÇΩÇflÇà API Ç≈Ç∑ÅBDZÇÃÇΩÇfläÓî’ÇΔÇ»ÇÈ APIÅiDZÇÃèÍçáÇÕ System Configuration ÉtÉåÅ[ÉÄÉèÅ[ÉNÅjÇ…êVǵǢã@î\Ç™í«â¡Ç≥ÇÍÇΩÇΔÇ´Ç…ÅAǪÇÍÇÁÇ™å›ä∑ê´Çï€éùÇ∑ÇÈÇΩÇflÇà APIÅiInternet ConfigÅjDžLJëgÇ›çûÇ‹ÇÍÇÈÇΔÇÕå¿ÇËÇ‹ÇπÇÒÅBDZÇÍÇ™ãñóeÇ≈Ç´ÇÈÇÃÇÕÅAInternet Config ÉxÅ[ÉXÇÃä˘ë∂ÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÇ¢Ç∏ÇÍLJÅAäÓî’ÇΔÇ»ÇÈ API Ç…í«â¡Ç≥ÇÍÇΩã@î\ÇëzíËǵǃǢǻǢÇΩÇflÇ≈Ç∑ÅB

System Configuration ÉtÉåÅ[ÉÄÉèÅ[ÉNÇ©ÇÁDZÇÃèÓïÒÇíºê⁄éÊìæÇ≈Ç´Ç‹Ç∑ÅBé¿ç€Ç…ÅADZÇÍÇé¿çsÇ∑ÇÈÇÃÇ…ìKǵÇΩÅASCDynamicStoreCopyProxies ÇΔǢǧçÇÉåÉxÉãÇà API Ç™ë∂ç›ÇµÇ‹Ç∑ÅBÇ®égÇ¢ÇÃÉvÉçÉOÉâÉÄÇ≈DZÇà API ÇégópÇ∑ÇÈÇ…ÇÕÅAÅuSystemConfiguration.frameworkÅvÇÉvÉçÉWÉFÉNÉgÇ…í«â¡ÇµÅA<SystemConfiguration/SystemConfiguration.h> ÉwÉbÉ_ÇÉCÉìÉNÉãÅ[ÉhǵNjÇ∑ÅBDZǧÇ∑ÇÈDZÇΔÇ≈ÅAÉäÉXÉg 1 Ç…é¶Ç∑ÇÊǧDž SCDynamicStoreCopyProxies ÇåƒÇ—èoÇπÇ‹Ç∑ÅB

ÉäÉXÉg 1. SCDynamicStoreCopyProxies ÇÃégóp

Boolean GetHTTPSProxySetting(char *host, size_t hostSize, UInt16 *port)
    // C ÇÃï∂éöóÒÇΔǵǃÅihost ÇΔ hostSize Ç…ÇÊǡǃéwíËÇ≥ÇÍÇÈÉoÉbÉtÉ@Ç…Åj
    // åªç›Çà HTTPS ÉvÉçÉLÉVê›íËÇΔÅAÉ|Å[Égî‘çÜÇï‘Ç∑
{
    Boolean             result;
    CFDictionaryRef     proxyDict;
    CFNumberRef         enableNum;
    int                 enable;
    CFStringRef         hostStr;
    CFNumberRef         portNum;
    int                 portInt;

    assert(host != NULL);
    assert(port != NULL);
    
    // ÉfÉBÉNÉVÉáÉiÉäÇéÊìæ
    
    proxyDict = SCDynamicStoreCopyProxies(NULL);
    result = (proxyDict != NULL);

    // óLå¯âªÉtÉâÉOÇéÊìæÅBDZÇÍÇÕÅACFBoolean Ç≈ÇÕÇ»Ç≠ CFNumber
    
    if (result) {
        enableNum = (CFNumberRef) CFDictionaryGetValue(proxyDict,
                kSCPropNetProxiesHTTPSEnable);

        result = (enableNum != NULL)
                && (CFGetTypeID(enableNum) == CFNumberGetTypeID());
    }
    if (result) {
        result = CFNumberGetValue(enableNum, kCFNumberIntType,
                    &enable) && (enable != 0);
    }
    
    // ÉvÉçÉLÉVÇÃÉzÉXÉgÇéÊìæÅBDNS ñºÇÕ ASCII ï∂éöÇ≈Ç»ÇØÇÍnjǻÇÁǻǢÅB
    // ÅuÉlÉbÉgÉèÅ[ÉNÅvä¬ã´ê›íËÉpÉlÉãÇÃÅuSecure Web ÉvÉçÉLÉVÅvÉtÉBÅ[ÉãÉh
    // ASCII à»äOÇÃï∂éöÇì¸óÕÇ∑ÇÈÇΔÅACFStringGetCString ä÷êîÇÕé∏îsǵǃ
    // false Çï‘Ç∑
    
    if (result) {
        hostStr = (CFStringRef) CFDictionaryGetValue(proxyDict,
                    kSCPropNetProxiesHTTPSProxy);

        result = (hostStr != NULL)
            && (CFGetTypeID(hostStr) == CFStringGetTypeID());
    }
    if (result) {
        result = CFStringGetCString(hostStr, host,
            (CFIndex) hostSize, kCFStringEncodingASCII);
    }
    
    // ÉvÉçÉLÉVÇÃÉ|Å[ÉgÇéÊìæ
    
    if (result) {
        portNum = (CFNumberRef) CFDictionaryGetValue(proxyDict,
                kSCPropNetProxiesHTTPSPort);

        result = (portNum != NULL)
            && (CFGetTypeID(portNum) == CFNumberGetTypeID());
    }
    if (result) {
        result = CFNumberGetValue(portNum, kCFNumberIntType, &portInt);
    }
    if (result) {
        *port = (UInt16) portInt;
    }

    // ÉNÉäÅ[ÉìÉAÉbÉv
    
    if (proxyDict != NULL) {
        CFRelease(proxyDict);
    }
    if ( ! result ) {
        *host = 0;
        *port = 0;
    }
    return result;
}

ÉäÉXÉg 1 ÇÕÅAHTTPS ÉvÉçÉLÉVê›íËÇéÊìæÇ∑ÇÈï˚ñ@ÇÃÇ›Çé¶ÇµÇƒÇ¢Ç‹Ç∑ÅBproxyDict ÉfÉBÉNÉVÉáÉiÉäDždžÇÈëºÇÃÉLÅ[Çí≤Ç◊ÇÈDZÇΔÇ…ÇÊǡǃÅAëºÇÃÉvÉçÉLÉVê›íËÇéÊìæÇ≈Ç´Ç‹Ç∑ÅBê›íËDžǬǢǃÇÃè⁄ç◊ÇÕÅA<SystemConfiguration/SCSchemaDefinitions.h> ÉwÉbÉ_ÉtÉ@ÉCÉãÇÃÉRÉÅÉìÉgÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB


[2003 îN 2 åé 6 ì˙]